home *** CD-ROM | disk | FTP | other *** search
Korn shell script | 1996-11-11 | 9.3 KB | 402 lines |
- #!/bin/ksh -p
- # setup correct directory from which to run Developer Toolbox
- dtdir="DT_utilities"
-
- export PATH="/usr/bsd:/bin:/usr/bin:/usr/sbin:/usr/bin/X11"
- fullprog=$0
- typeset -r prog=${0##*/}
- progdir=${0%/*}
- if [[ "$progdir" = \/* ]]; then
- typeset -r fullprogdir="$progdir"
- else
- [[ "$progdir" = "$fullprog" ]] && progdir="."
- cwd=$(pwd)
- cd $(pwd)/$progdir
- fullprogdir=$(pwd)
- cd $cwd
- typeset -r fullprogdir=$fullprogdir
- fi
- typeset -r fullprog="$fullprogdir/$prog"
- typeset -r progdir=$progdir
- typeset -r progdirname=$(basename $fullprogdir)
- typeset -r flags="hRru"
- typeset -r getoptflags=":${flags}f:C:\?"
- typeset -r numpositional=0
- if [[ "$TMPDIR" != "" ]]; then
- typeset -r tmpdir="$TMPDIR"
- elif [[ -d /usr/var/tmp ]]; then
- typeset -r tmpdir="/usr/var/tmp"
- else
- typeset -r tmpdir="/tmp"
- fi
- typeset -r tmp=$tmpdir/$prog.$$
- cleanuplist="$tmp"
- typeset -r SigList="INT QUIT TERM HUP"
- typeset errexit=0
- trap "trap - EXIT $SigList; CleanUp" EXIT
- trap exit $SigList
-
- # include this at beginning of each function as well
- if [ "$DEBUG" ] ; then set -$DEBUG ; : Debug enabled by envariable ; fi
-
- Usage () {
- echo "Usage: $prog [-r] [-f tmp_dir] [-C CD_dir]"
- echo " $prog -u [-f tmp_dir]"
- echo " $prog -R [-f tmp_dir]"
- echo " $prog -h\n"
- echo " -h Help text (this stuff)."
- echo " -r Remove $dtdir directory when $prog finishes."
- echo " -R Just remove $dtdir directory."
- echo " -u Just create $dtdir directory."
- echo " -f tmp_dir Possible directory to hold $dtdir."
- echo " -C CD_dir Directory of CD to be viewed."
- }
-
- Exit() {
- [ "$1" ] && echo "$*" >&2
- errexit=1
- exit
- }
-
- UsageExit() {
- [ "$1" ] && echo "$*" >&2
- Usage >&2
- Exit
- }
-
- Log () {
- [[ "$verbose" = yes ]] && echo >&2 "$@"
- }
-
- Do () {
- [[ ! -z "$verbose" || ! -z "$noexecute" ]] && echo >&2 "$@"
- [[ -z "$noexecute" ]] && "$@"
- typeset evalstatus=$?
- [[ ! -z "$noexecute" || $evalstatus = 0 ]]
- }
-
- DoExit () {
- Do $1 || Exit "$2"
- }
-
- DoUsageExit () {
- Do $1 || UsageExit "$2"
- }
-
- CleanUp () {
- : Add your own clean-up actions here
-
- eval /bin/rm -fr $cleanuplist
- exit $errexit
- }
-
- # Setexecutable variable_to_set executable absolute_path
- # also looks in same place this code came from
- SetExecutable () {
- set -$DEBUG
- typeset executable
- executable=$(whence $2)
- if [ "$executable" = "''" ] ; then
- executable=$(whence $progdir/$2)
- if [ "$executable" = "''" ] ; then
- executable=$3
- fi
- fi
- [ -x $executable ] || return 1
- # this strips leading ././* to single ./
- # [ "$( echo $executable | sed -e 's%^\./.*%%')" = "" ] &&
- # executable="./${executable##*(./)}"
- eval $1=\""$executable"\"
- return 0
- }
-
- SetExecExit () {
- set -$DEBUG
- SetExecutable $1 $2 $3 ||
- Exit "Unable to locate $2 for execution"
- }
-
- unset verbose noexecute removeDT DTUdir_list justload justrm CD_dir
- while getopts ${getoptflags} flag; do
- case $flag in
- f)
- DTUdir_list="$DTUdir_list $OPTARG"
- ;;
- h | \?)
- Usage >&2
- exit
- ;;
- u)
- justload=-u
- ;;
- r)
- removeDT=-r
- ;;
- R)
- justrm=-R
- ;;
- C)
- CD_dir="$OPTARG"
- ;;
- esac
- done
- shift OPTIND-1
-
- if (( $# != $numpositional )) ; then
- Usage >&2
- Exit
- fi
-
- #functions
- ###############################################################################
- addList() {
- typeset list=$1 new=$2
- [[ "$list" = "" ]] && list=" "
- [[ "$list" != *" $new "* ]] && list="$list$new "
- echo "$list"
- }
-
- localSpace() {
- typeset -i isfound
- typeset dir=$1 free
- [[ "$dir" = "" || ! -d $dir || ! -w $dir ]] && return 1
- /bin/df -k $dir | tail +2 | read _ _ _ _ free _
- if ((util_size < free)); then
- DTUdir=$dir
- DT_util=$dir/$dtdir
- return 0
- else
- nospace_list=$(addList "$nospace_list" $dir)
- return 1
- fi
- }
-
- make_dirlist() {
- typeset device dir alt_dirlist=""
- [[ "$DTUdir_list" != "" ]] && dirlist=$(addList "$dirlist" "$DTUdir_list")
- dirlist=$(addList "$dirlist" "/usr/tmp")
- alt_dirlist=$(addList "$alt_dirlist" "/usr")
- dirlist=$(addList "$dirlist" "/var/tmp")
- alt_dirlist=$(addList "$alt_dirlist" "/var")
- cat /etc/mtab | while read device dir _; do
- [[ "$device" != "/"* ]] && continue
- [[ "$dir" = "/" ]] && continue
- [[ "$dir" = "/dev/fd" ]] && continue
- [[ "$dir" = "/proc" ]] && continue
- dirlist=$(addList "$dirlist" $dir/tmp)
- alt_dirlist=$(addList "$alt_dirlist" $dir)
- done
- alt_dirlist=${alt_dirlist##*([ ])}
- dirlist="$dirlist$alt_dirlist /tmp"
- dirlist=${dirlist##*([ ])}
- }
-
- find_dtdir() {
- typeset dlist="$1" dir
- while [[ "$dlist" != "" ]]; do
- dir=$dlist
- dir=${dir%%[ ]*}
- dlist=${dlist##*([! ])*([ ])}
- if [[ -d $dir/$dtdir ]]; then
- DTUdir=$dir
- DT_util=$dir/$dtdir
- return 0
- fi
- done
- return 1
- }
-
- enumerate() {
- typeset list="$1" either="$2" or="$3" word newlist last
- list=${list##*([ ])}
- list=${list%%*([ ])}
- word=${list%%[ ]*}
- list=${list##*([! ])*( )}
- newlist="$word"
- if [[ "$list" != "" ]]; then
- newlist="$either $word"
- last=${list##*[ ]}
- list=${list%%*( )*([! ])}
- while [[ "$list" != "" ]]; do
- word=$list
- word=${word%%[ ]*}
- newlist="$newlist, $word"
- list=${list##*([! ])*( )}
- done;
- newlist="$newlist $or $last"
- fi
- echo "$newlist"
- }
-
- spaceCheck() {
- typeset dirlist="$1" dlist dir last msg ret m0 m1 m2 m2 m4
- dlist="$dirlist"
- dirlist=""
- while [[ "$dlist" != "" ]]; do
- dir=$dlist
- dir=${dir%%[ ]*}
- dlist=${dlist##*([! ])*([ ])}
- [[ "$dir" = "" || ! -d $dir || ! -w $dir ]] && continue
- dirlist="$dirlist $dir"
- done
- dlist=${dirlist##*([ ])}
- while [[ "$dlist" != "" ]]; do
- dir=${dlist%%[ ]*}
- dlist=${dlist##*([! ])*([ ])}
- localSpace $dir && break
- nospace_list="$nospace_list $dir"
- done
- if [[ "$DTUdir" != "" ]]; then
- msg="The janitor plans to copy $util_size Kbytes to $DT_util.\n\
- These are utilities necessary to view toolbox CDs."
- if [[ "$nospace_list" != "" ]]; then
- list=$(enumerate "$nospace_list" "either" "or")
- msg="${msg}\nNo space was found on $list"
- fi
- msg="${msg}\nIf you wish to select a different location for \
- these utilities,\n\
- then press No and re-run $prog with the -f option\n\n\
- Ready to copy $util_size Kbytes to $DT_util?"
- ret=$($DT_xconfirm yesno "$msg")
- [[ "$ret" = "No" ]] && exit
- return 0
- fi
- list=$(enumerate "$nospace_list" "either" "or")
- $DT_xconfirm warn "The janitor needed to copy $util_size Kbytes of\
- utilities\n\
- to your local disk in order to view these toolbox CDs.\n\
- No space was found on $list\n\
- Please re-run $prog with the -f option\n\
- to select a suitable location for these utilities."
- exit 1
- }
-
- cp_one() {
- typeset pat="$1"
- cp -r $pat .
- if (( $? )); then
- $DT_xconfirm error "Unable to copy\n\
- local Developer Toolbox $prog directory"
- exit 1
- fi
- }
-
- cp_DT_Utilities() {
- export DT_util_state=3
- spaceCheck "$dirlist"
- mkdir $DT_util
- cd $DT_util
- cp_one $CDROM_ROOT/.DT_Version
- cp_one $CDROM_ROOT/bin
- mv bin/* .
- rm -rf bin
- rm linkChunks
- cp_one $CDROM_ROOT/toolbox/www/cgi-bin
- cp_one $CDROM_ROOT/toolbox/www/icons
- cp_one $CDROM_ROOT/toolbox/www/conf
-
- }
-
- upgrade_DT_Utilities() {
- export DT_util_state=2
- echo "\nremoving outdated Toolbox utilities\n"
- rm -rf $DT_util > /dev/null 2>&1
- cp_DT_Utilities
- }
-
- #start
- ###############################################################################
- DT_xconfirm="$fullprogdir/DT_xconfirm"
- fullprogdirdir=$(dirname $fullprogdir)
-
- # See whether running from CDROM or DT_utilities
-
- if [[ -d $fullprogdirdir/toolbox ]]; then
- unset DTUdir DT_util
- if [[ "$CD_dir" = "" ]]; then
- export CDROM_ROOT=$fullprogdirdir
- else
- if [[ ! -d $CD_dir/toolbox ]]; then
- $DT_xconfirm error "The -C option directory ($CD_dir)\n\
- is not a valid Developer Toolbox CD directory"
- exit 1
- fi
- export CDROM_ROOT="$CD_dir"
- fi
- elif [[ -f $fullprogdir/.DT_Version ]]; then
- if [[ "$justrm" != "" ]]; then
- rm -rf $progdir
- echo "\nremoving Toolbox utilities\n"
- exit 0
- fi
- if [[ "$CD_dir" = "" ]]; then
- $DT_xconfirm error "You must use the -C option when running\n\
- $prog from $fullprogdir"
- exit 1
- fi
- if [[ ! -d $CD_dir/toolbox ]]; then
- $DT_xconfirm error "The -C option directory ($CD_dir)\n\
- is not a valid Developer Toolbox CD directory"
- exit 1
- fi
- DTUdir=$fullprogdirdir
- DT_util=$fullprogdir
- export CDROM_ROOT="$CD_dir"
- else
- $DT_xconfirm error "You must run $prog from\n\
- a Developer Toolbox CD directory\n\
- or from a DT_utilities directory with the -C option"
- exit 1
- fi
-
- typeset -i util_size
- typeset -i getdir=1 free CD_version DTU_version
- unset nospace_list dirlist
-
- # find/make/update DT_utilities
-
- make_dirlist
- if find_dtdir "$dirlist"; then
- if [[ "$justrm" != "" ]]; then
- rm -rf $DT_util
- echo "\nremoving Toolbox utilities\n"
- exit 0
- fi
- [[ -f $CDROM_ROOT/.DT_Size ]] && util_size=`cat $CDROM_ROOT/.DT_Size`
- CDVfile="$CDROM_ROOT/.DT_Version"
- DTVfile="$DT_util/.DT_Version"
- CD_version=$(head -1 $CDVfile 2> /dev/null)
- DTU_version=$(head -1 $DTVfile 2> /dev/null)
- if [[ -f $DTVfile ]] ; then
- if ((DTU_version<CD_version)); then
- upgrade_DT_Utilities
- else
- export DT_util_state=1
- cd $DTUdir > /dev/null 2>&1
- fi
- else
- upgrade_DT_Utilities
- fi
- else
- if [[ "$justrm" != "" ]]; then
- echo "\nno Toolbox utilities to remove\n"
- exit 1
- fi
- [[ -f $CDROM_ROOT/.DT_Size ]] && util_size=`cat $CDROM_ROOT/.DT_Size`
- cp_DT_Utilities
- fi
-
- [[ "$justload" != "" ]] && exit 0
- if [[ "$removeDT" = "" ]]; then
- exec $DT_util/runDT
- else
- exec $DT_util/runDT $DT_util
- fi
-
- # Emacs exit, stops shell from parsing sh-mode
- exit
-
- # Local variables:
- # eval: (if (fboundp 'sh-mode) (sh-mode))
- # end:
-